module present_encryptor_top(data_out,data_in,valid,en,key_in,clk);


input  [79:0] key_in;  //初始密匙
input  wire [63:0] data_in;  //初始明文
input  wire clk; 
input  wire en; 

output wire[63:0] data_out;   //最终密文输出
output reg valid; //valid在迭代31次后置1，表示密文输出可用


reg  [79 : 0] key; //每次迭代的key
reg           flag;   //flag受en控制，置1开始迭代加密，迭代结束置0
reg  [63 : 0] data; 
reg  [4  : 0] round_counter;   //迭代计数31次
wire [63 : 0] round_key; 
wire [63 : 0] sub_per_input; 
wire [63 : 0] sub_per_output;
wire [79 : 0] key_update_out; 


/*初始化*/
initial begin 
    flag=0;
    valid=0;
    round_counter=0;
end


/*明文加密迭代例化*/
sub_per present_cipher_sp(.s_p_out(sub_per_output),
                          .s_p_in(sub_per_input)); 

/*key迭代例化*/
key_update present_cipher_key_update(.key_update_out(key_update_out),
                                     .key_update_in(key),
                                     .round_counter(round_counter)); 
                                     
                                     
assign round_key = key[79:16]; //key取高64位做round_key
assign sub_per_input = data^round_key; 
assign data_out = sub_per_input; //迭代一次data_out输出sup_per模块的计算值

always @(posedge clk)begin
    if(en) begin  //en使能，flag置1开始加密
        flag<=1;
    end 
    else begin
        flag<=flag;
    end
    
    
    if(valid==1) begin
        valid<=0;////valid保持一个周期，置1表示密文可输出 
    end 
    
    if(flag==1) begin//flag==1,开始加密
        if(round_counter==0)begin    //第一次迭代加密  
            key <= key_in;    //初始密钥输入
            data <=data_in;  //初始明文输入
            round_counter <= round_counter + 1'b1;
        
end
        else begin
             data <= sub_per_output;    //明文迭代加密
             key <= key_update_out;  //密钥迭代加密
             round_counter <= round_counter + 1'b1; 
             if(round_counter==31) begin  //迭代加密完成
                round_counter<=0;
                flag<=0;
                valid<=1;
             end          
        end

    end
end

endmodule